/*
 *	FilePoller.h
 *
 *	Entidad que se encarga del polling de la aplicacion Cliente. Basicamente, toma todos los
 *	archivos especificados en el directorio AU de la app, recalcula los hashes y compara
 *	con el indice de archivos y hashes que posee la app como repositorio. Actualiza
 *	este indice e informa sobre los nuevos cambios
*/

#ifndef FILEPOLLER_H_
#define FILEPOLLER_H_

#include <iostream>

#include <fstream>
#include <list>
#include <cstring>
#include "MyException.h"
#include <dirent.h>		// Funciones para recorrer directorio
#include <cstdio>		// remove(const char* filename)
#include "DiferenciaNewFile.h"
#include "DiferenciaDeletedFile.h"
#include "DiferenciaModifiedFile.h"

#include "ObtenerContenidosArchivo.h"

#include "FileDateModification.h"

class FilePoller {
	std::string dirPath;
	std::string indexPath;
	std::fstream&	indiceHashes;
	std::list<Diferencia*> diferencias;
	std::list<std::string> newFiles;
	std::list<std::string> deletedFiles;
	std::list<std::string> oldHashes;

	public:
		FilePoller(std::fstream& indice, const char* dirPath, const char* indexPath)
		: indiceHashes(indice) {
			this->dirPath = dirPath;
			this->indexPath = indexPath;
		};
		FilePoller(const char* path);
		virtual ~FilePoller();

		//	Actualiza el indice de archivos y hashes local del cliente
		void poll();
		/*	Devuelve la lista de diferencias para actualizar en el server al
		 *	hacer polling
		 */
		std::list<Diferencia*> getListaDiferencias();
		/* Me devuelve en listaNombres los nombres de todos los archivos del repo local
		 * ordenados por nombre
		 */
		void getListaArchivosRepo(std::list<std::string>& listaNombres);

		/* Me devuelve la lista generada por el poller que contiene los nombres de los
		 * nuevos archivos generados por el user mientras esta desconectado
		 * */
		std::list<std::string> getListaArchivosNuevos() {return (this->newFiles);};
		std::list<std::string> getListaArchivosBorrados() {return (this->deletedFiles);}
		std::list<std::string> getListaOldHashes() {return (this->oldHashes);};

		// Obtengo los datos del siguiente archivo en el archivo indice
		void getArchivoIndice(std::fstream& indice, std::string& nombre,
				std::string& data, FileDateModification& fechaMod);

		// Obtengo los datos del siguiente archivo en el directorio
		void getArchivoRepo(std::fstream& archivoAux, std::string& hashArchivoRepo,
			FileDateModification& fechaModificacionRepo,
			std::list<std::string>::iterator& it);

		void escribirArchivoAIndice(std::fstream& indice, const std::string& nombre,
				const std::string& data, const FileDateModification& fechaMod);
};

#endif
